extends Node2D
# 此脚本的作用是生成怪物

# 用户本体
@export var player : CharacterBody2D
# 怪物场景
@export var enemy : PackedScene
# 获取怪物列表
@export var enemy_types : Array[Enemy]
@export var can_spawn : bool
var distance : float = 400
@export var max_enemy : int = 300

var minute : int:
	# 自定义setter方法,在minute变量更新时执行set中的操作
	set(value):
		minute = value
		%Minute.text = str(value)

var second : int:
	# 自定义setter方法,在second变量更新时执行set中的操作
	set(value):
		second = value
		if second >= 10:
			second -= 10
			minute += 1
			# lpad(2,'0') : 字符串最长2位数,不满足的在前面补充0
			# 1->01  10->10
		%Second.text = str(second).lpad(2,'0')
			
			
func _physics_process(_delta: float) -> void:
	#查找指定分组的敌人数量
	if get_tree().get_node_count_in_group("Enemy") < max_enemy:
		can_spawn = true
	else:
		can_spawn = false
	
# 每次生成一个怪物	
func spown(pos : Vector2,elite :bool = false):
	# 如果超出最大可创建物数量,且是普通怪物类型,则不创建怪物
	if !can_spawn && !elite:
		return
	# 实例化enemy场景d
	var enemy_instance = enemy.instantiate()
	# 将enemy_types对象中,指定索引的怪物类型赋值给怪物对象
	#具体给哪个是根据波次来计算的
	#比如第一波 (minute = 0) < (enemy_types.size() -1 = 5) 所以返回值是enemy_types[1] 也就是第一个怪物
	enemy_instance.type = enemy_types[min(minute,enemy_types.size() -1)]
	# 给实例化后的enemy对象设置初始位置
	enemy_instance.position = pos
	# 给实例化后的enemy对象设置要关注的player对象
	enemy_instance.player_reference = player
	enemy_instance.elite = elite
	# 把实例化后的enemy对象放入节点树中
	get_tree().current_scene.add_child(enemy_instance)

# 获取围绕用户的怪物的起始位置(圆形)
func get_random_position() -> Vector2:
	return player.position + distance * Vector2.RIGHT.rotated(randf_range(0,2 * PI))
	
# 循环生成指定数量的怪物
func amount(number : int = 1):
	for i in range(number):
		spown(get_random_position())
	
# 关联Timer默认方法,每秒执行一次
func _on_timer_timeout() -> void:
	second += 1
	# second对10 取余,意思是每次生成1-9之间的enemy对象
	amount(second % 10)

# 每次循环生成75个怪物
func _on_pattern_timeout() -> void:
	for i in range(75):
		spown(get_random_position())


func _on_elite_timeout() -> void:
	# 每秒创建一个精英怪
	spown(get_random_position(),true)
